<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora051.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora053.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2><A NAME="toc69"></A>
<H3> Polar coordinates</H3>
Coordinates as used in the library <TT>Graphics</TT> are Cartesian. There
a line segment is represented by its starting point <EM>(x0,y0)</EM>
and its end point <EM>(x1,y1)</EM>. It can be useful to use polar
coordinates instead. Here a line segment is described by its point of
origin <EM>(x0,y0)</EM>, a length (radius) <EM>(r)</EM> and an angle
<EM>(a)</EM>. The relation between Cartesian and Polar coordinates is
defined by the following equations:
<DIV ALIGN=center><TABLE CELLSPACING=0 CELLPADDING=0>
<TR VALIGN=middle><TD NOWRAP>
 </TD>
<TD NOWRAP><FONT FACE=symbol>
�<BR>�<BR>�</FONT></TD>
<TD NOWRAP> </TD>
<TD NOWRAP><TABLE CELLSPACING=2 CELLPADDING=0>
<TR><TD  ALIGN=left NOWRAP><I>x</I><SUB><FONT SIZE=2>1</FONT></SUB></TD>
<TD  ALIGN=left NOWRAP>=</TD>
<TD  ALIGN=left NOWRAP><I>x</I><SUB><FONT SIZE=2>0</FONT></SUB> + <I>r</I> * cos(<I>a</I>)</TD>
</TR>
<TR><TD  ALIGN=left NOWRAP><I>y</I><SUB><FONT SIZE=2>1</FONT></SUB></TD>
<TD  ALIGN=left NOWRAP>=</TD>
<TD  ALIGN=left NOWRAP><I>y</I><SUB><FONT SIZE=2>0</FONT></SUB> + <I>r</I> * sin(<I>a</I>)</TD>
</TR></TABLE></TD>
<TD NOWRAP>
 </TD>
</TR></TABLE></DIV>
The following type defines the polar coordinates of a line segment:


<PRE><BR># <B>type</B><CODE> </CODE>seg_pol<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{x<CODE>:</CODE>float;<CODE> </CODE>y<CODE>:</CODE>float;<CODE> </CODE>r<CODE>:</CODE>float;<CODE> </CODE>a<CODE>:</CODE>float};;<BR><CODE>type seg_pol = { x: float; y: float; r: float; a: float }</CODE><BR>

</PRE>
<BR>
<BR>
<OL type=1>
<LI>
 Write the function <TT><A id="a151__1_APPEND/PGcor.ml.tex" href="javascript: void showMessage('1_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/PGcor.ml.tex,tocart -->to_cart</SPAN></A></TT>  
that converts polar coordinates to Cartesian ones.
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>to_cart<CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>p<CODE>.</CODE>x<CODE>,</CODE>p<CODE>.</CODE>y<TT>)</TT><CODE>,</CODE><TT>(</TT>p<CODE>.</CODE>x<CODE> </CODE><CODE>+.</CODE><CODE> </CODE>p<CODE>.</CODE>r<CODE> </CODE><CODE>*.</CODE><CODE> </CODE><TT>(</TT>cos<CODE> </CODE>p<CODE>.</CODE>a<TT>)</TT><CODE>,</CODE><CODE> </CODE>p<CODE>.</CODE>y<CODE> </CODE><CODE>+.</CODE><CODE> </CODE>p<CODE>.</CODE>r<CODE> </CODE><CODE>*.</CODE><CODE> </CODE><TT>(</TT>sin<CODE> </CODE>p<CODE>.</CODE>a<TT>)</TT><TT>)</TT><CODE> </CODE>;;<BR><CODE>val to_cart : seg_pol -&gt; (float * float) * (float * float) = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write the function <TT><A id="a152__2_APPEND/PGcor.ml.tex" href="javascript: void showMessage('2_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/PGcor.ml.tex,drawseg -->draw_seg</SPAN></A></TT> which 
displays a line segment defined by polar coordinates in the reference
point of <TT>Graphics</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>draw_seg<CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><TT>(</TT>x1<CODE>,</CODE>y1<TT>)</TT><CODE>,</CODE><TT>(</TT>x2<CODE>,</CODE>y2<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>to_cart<CODE> </CODE>p<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.moveto<CODE> </CODE><TT>(</TT>int_of_float<CODE> </CODE>x1<TT>)</TT><CODE> </CODE><TT>(</TT>int_of_float<CODE> </CODE>y1<TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.lineto<CODE> </CODE><TT>(</TT>int_of_float<CODE> </CODE>x2<TT>)</TT><CODE> </CODE><TT>(</TT>int_of_float<CODE> </CODE>y2<TT>)</TT><CODE> </CODE>;;<BR><CODE>val draw_seg : seg_pol -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> One of the motivations behind polar coordinates is to be able
to easily apply transformations to line segments. A translation only
modifies the point of origin, a rotation only affects the angle field
and modifying the scale only changes the length field. Generally,
one can represent a transformation as a triple of floats: the first
represents the translation (we do not consider the case of translating
the second point of the line segment here), the second the rotation and
the third the scaling factor. Define the function
<TT><A id="a153__3_APPEND/PGcor.ml.tex" href="javascript: void showMessage('3_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/PGcor.ml.tex,apptrans -->app_trans</SPAN></A></TT>  
which takes a line segment in polar coordinates and
a triple of transformations and returns the new segment.
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>app_trans<CODE> </CODE>seg<CODE> </CODE><TT>(</TT><CODE> </CODE>da<CODE>,</CODE><CODE> </CODE>dr<CODE>,</CODE><CODE> </CODE>dxy<CODE> </CODE><TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><CODE>_,</CODE><TT>(</TT>x1<CODE>,</CODE>y1<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>to_cart<CODE> </CODE>{seg<CODE> </CODE><B>with</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>seg<CODE>.</CODE>r<CODE> </CODE><CODE>*.</CODE><CODE> </CODE>dxy}<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>{x<CODE>=</CODE>x1;<CODE> </CODE>y<CODE>=</CODE>y1;<CODE> </CODE>a<CODE>=</CODE>seg<CODE>.</CODE>a<CODE> </CODE><CODE>+.</CODE><CODE> </CODE>da;<CODE> </CODE>r<CODE>=</CODE>seg<CODE>.</CODE>r<CODE> </CODE><CODE>*.</CODE><CODE> </CODE>dr}<CODE> </CODE>;;<BR><CODE>val app_trans : seg_pol -&gt; float * float * float -&gt; seg_pol = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> One can construct recursive drawings by iterating
transformations. Write the function <TT><A id="a154__4_APPEND/PGcor.ml.tex" href="javascript: void showMessage('4_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/PGcor.ml.tex,drawr -->draw_r</SPAN></A></TT>  
which takes as arguments a line segment <TT>s</TT>, a number of
iterations <TT>n</TT>, a list of transformations and displays all the
segments resulting from the transformations on <TT>s</TT> iterated up
to <TT>n</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>draw_r<CODE> </CODE>s<CODE> </CODE>n<CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>then</B><CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>begin</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>draw_seg<CODE> </CODE>s;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>List.iter<CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>t<CODE> </CODE>-&gt;<CODE> </CODE>draw_r<CODE> </CODE><TT>(</TT>app_trans<CODE> </CODE>s<CODE> </CODE>t<TT>)</TT><CODE> </CODE><TT>(</TT>n<CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE>l<TT>)</TT><CODE> </CODE>l<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>val draw_r : seg_pol -&gt; int -&gt; (float * float * float) list -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a155__5_APPEND/PGcor.ml.tex" href="javascript: void showMessage('5_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/PGcor.ml.tex,program -->Verify</SPAN></A> that the following program does produce 
the images in figure <A HREF="book-ora052.html#fig-arbres">5.10</A>.


<PRE><BR><B>let</B><CODE> </CODE>pi<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>3</CODE><CODE>.</CODE><CODE>1</CODE><CODE>4</CODE><CODE>1</CODE><CODE>5</CODE><CODE>9</CODE><CODE>2</CODE><CODE>7</CODE><CODE> </CODE>;;<BR><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{x<CODE>=</CODE><CODE>1</CODE><CODE>0</CODE><CODE>0</CODE><CODE>.</CODE>;<CODE> </CODE>y<CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE>;<CODE> </CODE>a<CODE>=</CODE><CODE> </CODE>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>2</CODE><CODE>.</CODE>;<CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE>0</CODE><CODE>.}</CODE><CODE> </CODE>;;<BR>draw_r<CODE> </CODE>s<CODE> </CODE><CODE>6</CODE><CODE> </CODE><CODE>[</CODE><CODE> </CODE><TT>(</TT><CODE>-.</CODE>pi<CODE>/.</CODE><CODE>2</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE>0</CODE><CODE>.</CODE><CODE>6</CODE><CODE>,</CODE><CODE>1</CODE><CODE>.</CODE>;<CODE> </CODE><TT>(</TT>pi<CODE>/.</CODE><CODE>2</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>6</CODE><CODE>,</CODE><CODE>1</CODE><CODE>.</CODE><CODE>0</CODE><CODE>]</CODE><CODE> </CODE>;;<BR>Graphics.clear_graph();;<BR>draw_r<CODE> </CODE>s<CODE> </CODE><CODE>6</CODE><CODE> </CODE><CODE>[</CODE><TT>(</TT><CODE>-.</CODE>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>6</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>6</CODE><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>7</CODE><CODE>6</CODE><CODE>6</CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT><CODE>-.</CODE>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>4</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>5</CODE><CODE>5</CODE><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>3</CODE><CODE>3</CODE><CODE>3</CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>3</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>4</CODE><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>5</CODE><CODE> </CODE><CODE>]</CODE><CODE> </CODE>;;<BR>

</PRE>

<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># Graphics.close_graph();;<BR><CODE>- : unit = ()</CODE><BR># Graphics.open_graph<CODE> </CODE><CODE>" 200x200"</CODE>;;<BR><CODE>- : unit = ()</CODE><BR># <B>let</B><CODE> </CODE>pi<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>3</CODE><CODE>.</CODE><CODE>1</CODE><CODE>4</CODE><CODE>1</CODE><CODE>5</CODE><CODE>9</CODE><CODE>2</CODE><CODE>7</CODE><CODE> </CODE>;;<BR><CODE>val pi : float = 3.1415927</CODE><BR># <B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{x<CODE>=</CODE><CODE>1</CODE><CODE>0</CODE><CODE>0</CODE><CODE>.</CODE>;<CODE> </CODE>y<CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE>;<CODE> </CODE>a<CODE>=</CODE><CODE> </CODE>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>2</CODE><CODE>.</CODE>;<CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE>0</CODE><CODE>.}</CODE><CODE> </CODE>;;<BR><CODE>val s : seg_pol = {x=100; y=0; r=100; a=1.57079635}</CODE><BR># draw_r<CODE> </CODE>s<CODE> </CODE><CODE>6</CODE><CODE> </CODE><CODE>[</CODE><CODE> </CODE><TT>(</TT><CODE>-.</CODE>pi<CODE>/.</CODE><CODE>2</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE>0</CODE><CODE>.</CODE><CODE>6</CODE><CODE>,</CODE><CODE>1</CODE><CODE>.</CODE>;<CODE> </CODE><TT>(</TT>pi<CODE>/.</CODE><CODE>2</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>6</CODE><CODE>,</CODE><CODE>1</CODE><CODE>.</CODE><CODE>0</CODE><CODE>]</CODE><CODE> </CODE>;;<BR><CODE>- : unit = ()</CODE><BR># Graphics.clear_graph();;<BR><CODE>- : unit = ()</CODE><BR># draw_r<CODE> </CODE>s<CODE> </CODE><CODE>6</CODE><CODE> </CODE><CODE>[</CODE><TT>(</TT><CODE>-.</CODE>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>6</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>6</CODE><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>7</CODE><CODE>6</CODE><CODE>6</CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT><CODE>-.</CODE>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>4</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>5</CODE><CODE>5</CODE><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>3</CODE><CODE>3</CODE><CODE>3</CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>pi<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>3</CODE><CODE>.</CODE><TT>)</TT><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>4</CODE><CODE>,</CODE><CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>5</CODE><CODE> </CODE><CODE>]</CODE><CODE> </CODE>;;<BR><CODE>- : unit = ()</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><BLOCKQUOTE><DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV>
<DIV ALIGN=center>
<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=1>
<TR><TD  ALIGN=left NOWRAP><IMG SRC="book-ora019.gif"></TD>
<TD  ALIGN=left NOWRAP><IMG SRC="book-ora020.gif"></TD>
</TR></TABLE>
</DIV>
<BR>
<DIV ALIGN=center>Figure 5.10: Recursive drawings.</DIV><BR>

<A NAME="fig-arbres"></A>
<DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE><A NAME="toc70"></A>
<H3> Bitmap editor</H3>
We will attempt to write a small bitmap editor (similar to the command
<TT>bitmap</TT> in X-window). For this we represent a bitmap by its
dimensions (width and height), the pixel size and a two-dimensional
table of booleans.<BR>
<BR>
<OL type=1>
<LI>
 Define a type <I><A id="a156__6_APPEND/PGcor.ml.tex" href="javascript: void showMessage('6_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/PGcor.ml.tex,PGstate -->bitmap_state</SPAN></A></I> describing 
the information necessary for containing the values of the pixels,
the size of the bitmap and the colors of displayed and erased points.
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR><BR># <B>type</B><CODE> </CODE>bitmap_state<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>{w<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE>h<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE>fg<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Graphics.color;<CODE> </CODE>bg<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Graphics.color;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>pix<CODE> </CODE><CODE>:</CODE><CODE> </CODE>bool<CODE> </CODE>array<CODE> </CODE>array;<CODE> </CODE>s<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int}<CODE> </CODE>;;<BR><CODE>type bitmap_state =</CODE><BR><CODE>  { w: int;</CODE><BR><CODE>    h: int;</CODE><BR><CODE>    fg: Graphics.color;</CODE><BR><CODE>    bg: Graphics.color;</CODE><BR><CODE>    pix: bool array array;</CODE><BR><CODE>    s: int }</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function for creating bitmaps
(<TT><A id="a157__7_APPEND/PGcor.ml.tex" href="javascript: void showMessage('7_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/PGcor.ml.tex,PGcreate -->create_bitmap</SPAN></A></TT>)  
and for displaying bitmaps
(<TT><A id="a158__8_APPEND/PGcor.ml.tex" href="javascript: void showMessage('8_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/PGcor.ml.tex,PGdraw -->draw_bitmap</SPAN></A></TT>) . <!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/PGcor.ml.tex","");
// --></script><span style=""> 
 

<PRE><BR># <B>let</B><CODE> </CODE>create_bitmap<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE>f<CODE> </CODE>g<CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.make_matrix<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE><B>false</B><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>w<CODE> </CODE><CODE>=</CODE><CODE> </CODE>x;<CODE> </CODE>h<CODE> </CODE><CODE>=</CODE><CODE> </CODE>y;<CODE> </CODE>fg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>f;<CODE> </CODE><CODE> </CODE>bg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>g;<CODE> </CODE>pix<CODE> </CODE><CODE>=</CODE><CODE> </CODE>r;<CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>s}<CODE> </CODE>;;<BR><CODE>val create_bitmap :</CODE><BR><CODE>  int -&gt; int -&gt; Graphics.color -&gt; Graphics.color -&gt; int -&gt; bitmap_state =</CODE><BR><CODE>  &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("7_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>draw_pix<CODE> </CODE>i<CODE> </CODE>j<CODE> </CODE>s<CODE> </CODE>c<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.set_color<CODE> </CODE>c;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.fill_rect<CODE> </CODE><TT>(</TT>i<CODE>*</CODE>s<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>j<CODE>*</CODE>s<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>s<CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>s<CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE>;;<BR><CODE>val draw_pix : int -&gt; int -&gt; int -&gt; Graphics.color -&gt; unit = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>draw_bitmap<CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>b<CODE>.</CODE>w<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>j<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>b<CODE>.</CODE>h<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>draw_pix<CODE> </CODE>i<CODE> </CODE>j<CODE> </CODE>b<CODE>.</CODE>s<CODE> </CODE><TT>(</TT><B>if</B><CODE> </CODE>b<CODE>.</CODE>pix<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE>b<CODE>.</CODE>fg<CODE> </CODE><B>else</B><CODE> </CODE>b<CODE>.</CODE>bg<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val draw_bitmap : bitmap_state -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("8_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write the functions <TT><A id="a159__9_APPEND/PGcor.ml.tex" href="javascript: void showMessage('9_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/PGcor.ml.tex,PGread -->read_bitmap</SPAN></A></TT>  
and <TT><A id="a160__10_APPEND/PGcor.ml.tex" href="javascript: void showMessage('10_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 10,APPEND/PGcor.ml.tex,PGwrite -->write_bitmap</SPAN></A></TT> which respectively read 
and write in a file passed as parameter following the ASCII format of
X-window. If the file does not exist, the function for reading creates
a new bitmap using the function <TT>create_bitmap</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>read_file<CODE> </CODE>filename<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ic<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_in<CODE> </CODE>filename<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>aux<CODE> </CODE><CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>line<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>input_line<CODE> </CODE>ic<TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>line<CODE> </CODE>::<CODE> </CODE><TT>(</TT>aux<CODE> </CODE>()<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE>End_of_file<CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE>close_in<CODE> </CODE>ic<CODE> </CODE>;<CODE> </CODE>[]<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>aux<CODE> </CODE>();;<BR><CODE>val read_file : string -&gt; string list = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>read_bitmap<CODE> </CODE>filename<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.of_list<CODE> </CODE><TT>(</TT>read_file<CODE> </CODE>filename<TT>)</TT><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>h<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.length<CODE> </CODE>r<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>w<CODE> </CODE><CODE>=</CODE><CODE> </CODE>String.length<CODE> </CODE>r<CODE>.</CODE><TT>(</TT><CODE>0</CODE><TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE>create_bitmap<CODE> </CODE>w<CODE> </CODE>h<CODE> </CODE>Graphics.black<CODE> </CODE>Graphics.white<CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>j<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE><CODE> </CODE>h<CODE> </CODE><CODE>-</CODE><CODE> </CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>w<CODE> </CODE><CODE>-</CODE><CODE> </CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>b<CODE>.</CODE>pix<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><CODE> </CODE><TT>(</TT><CODE> </CODE>r<CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE>.[</CODE>i<CODE>]</CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>'#'</CODE><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>b<CODE> </CODE>;;<BR><CODE>val read_bitmap : string -&gt; bitmap_state = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("9_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__10_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","10_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>write_bitmap<CODE> </CODE>filename<CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>oc<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_out<CODE> </CODE>filename<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>f<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>output_char<CODE> </CODE>oc<CODE> </CODE><TT>(</TT><B>if</B><CODE> </CODE>x<CODE> </CODE><B>then</B><CODE> </CODE><CODE>'#'</CODE><CODE> </CODE><B>else</B><CODE> </CODE><CODE>'-'</CODE><TT>)</TT><CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Array.iter<CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE><TT>(</TT>Array.iter<CODE> </CODE>f<CODE> </CODE>x<TT>)</TT>;<CODE> </CODE>output_char<CODE> </CODE>oc<CODE> </CODE><CODE>'\n'</CODE><TT>)</TT><CODE> </CODE>b<CODE>.</CODE>pix<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>close_out<CODE> </CODE>oc<CODE> </CODE>;;<BR><CODE>val write_bitmap : string -&gt; bitmap_state -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("10_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>A displayed pixel is represented by the character <CODE>#</CODE>, the absence
of a pixel by the character <CODE>-</CODE>. Each line of characters represents
a line of the bitmap. One can test the program using the functions
<CODE>atobm</CODE> and <CODE>bmtoa</CODE> of X-window, which convert between
this ASCII format and the format of bitmaps created by the command
<TT>bitmap</TT>. Here is an example.<BR>
<BR>
<FONT SIZE=1>
</FONT><PRE><FONT SIZE=1>
 ###################-------------#######---------######
 ###################---------------###-------------##--
 ###-----###-----###---------------###-------------#---
 ##------###------##----------------###-----------##---
 #-------###-------#-----------------###---------##----
 #-------###-------#-----------------###--------##-----
 --------###--------------------------###-------#------
 --------###-------###############-----###----##-------
 --------###-------###---------###------###--##--------
 --------###-------###----------##-------###-#---------
 --------###-------###-----------#-------#####---------
 --------###-------###-----------#--------###----------
 --------###-------###--------------------####---------
 --------###-------###--------------------####---------
 --------###-------###------#-----------##---###-------
 --------###-------###------#----------##----###-------
 --------###-------##########----------#------###------
 --------###-------##########---------##-------###-----
 --------###-------###------#--------##--------###-----
 --------###-------###------#-------##----------###----
 --------###-------###--------------#------------###---
 ------#######-----###-----------#######--------#######
 ------------------###---------------------------------
 ------------------###-----------#---------------------
 ------------------###-----------#---------------------
 ------------------###----------##---------------------
 ------------------###---------###---------------------
 ------------------###############---------------------
</FONT></PRE>
<LI> We reuse the <A id="a161__11_APPEND/PGcor.ml.tex" href="javascript: void showMessage('11_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 11,APPEND/PGcor.ml.tex,PGskeleton -->skeleton</SPAN></A> for interactive loops 
on page <A HREF="book-ora050.html#sec-squelette">??</A> to construct the graphical interface
of the editor. The human-computer interface is very simple. The bitmap
is permanently displayed in the graphical window. A mouse click in one
of the slots of the bitmap inverts its color. This change is reflected
on the screen. Pressing the key 'S' saves the bitmap in a file. The key
'Q' terminates the program.
<UL>
<LI>
 Write a function <TT><A id="a162__12_APPEND/PGcor.ml.tex" href="javascript: void showMessage('12_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 12,APPEND/PGcor.ml.tex,PGstart -->start</SPAN></A></TT> of type 
<I>bitmap_state -&gt; unit -&gt; unit</I> which opens a graphical window
and displays the bitmap passed as parameter.
<!-- POPUP DEFINITION -->
<layer id="l__11_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","11_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>exception</B><CODE> </CODE>End<CODE> </CODE>;;<BR><CODE>exception End</CODE><BR># <B>let</B><CODE> </CODE>skel<CODE> </CODE>f_init<CODE> </CODE>f_end<CODE> </CODE>f_key<CODE> </CODE>f_mouse<CODE> </CODE>f_except<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>f_init<CODE> </CODE>();<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Graphics.wait_next_event<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>[</CODE>Graphics<CODE>.</CODE>Button_down;<CODE> </CODE>Graphics<CODE>.</CODE>Key_pressed<CODE>]</CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE>.</CODE>Graphics.keypressed<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>then</B><CODE> </CODE>f_key<CODE> </CODE>s<CODE>.</CODE>Graphics.key<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE>.</CODE>Graphics.button<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>then</B><CODE> </CODE>f_mouse<CODE> </CODE>s<CODE>.</CODE>Graphics.mouse_x<CODE> </CODE>s<CODE>.</CODE>Graphics.mouse_y<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End<CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>End<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE>e<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>f_except<CODE> </CODE>e<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End<CODE> </CODE>-&gt;<CODE> </CODE>f_end<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val skel :</CODE><BR><CODE>  (unit -&gt; 'a) -&gt;</CODE><BR><CODE>  (unit -&gt; unit) -&gt;</CODE><BR><CODE>  (char -&gt; unit) -&gt; (int -&gt; int -&gt; unit) -&gt; (exn -&gt; unit) -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("11_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__12_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","12_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>start<CODE> </CODE>b<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>sw<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>+</CODE>b<CODE>.</CODE>w<CODE>*</CODE>b<CODE>.</CODE>s<CODE> </CODE><B>and</B><CODE> </CODE>sh<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>+</CODE>b<CODE>.</CODE>h<CODE>*</CODE>b<CODE>.</CODE>s<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.open_graph<CODE> </CODE><TT>(</TT><CODE>" "</CODE><CODE> </CODE><CODE>^</CODE><CODE> </CODE><TT>(</TT>string_of_int<CODE> </CODE>sw<TT>)</TT><CODE> </CODE><CODE>^</CODE><CODE> </CODE><CODE>"x"</CODE><CODE> </CODE><CODE>^</CODE><CODE> </CODE><TT>(</TT>string_of_int<CODE> </CODE>sh<TT>)</TT><TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.set_color<CODE> </CODE><TT>(</TT>Graphics.rgb<CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.fill_rect<CODE> </CODE><CODE>0</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE>sw<CODE> </CODE>sh<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>draw_bitmap<CODE> </CODE>b<CODE> </CODE>;;<BR><CODE>val start : bitmap_state -&gt; unit -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("12_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Write a function <TT><A id="a163__13_APPEND/PGcor.ml.tex" href="javascript: void showMessage('13_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 13,APPEND/PGcor.ml.tex,PGstop -->stop</SPAN></A></TT> that closes the 
graphical window and exits the program.
<!-- POPUP DEFINITION -->
<layer id="l__13_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","13_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>stop<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Graphics.close_graph()<CODE> </CODE>;<CODE> </CODE>exit<CODE> </CODE><CODE>0</CODE><CODE> </CODE>;;<BR><CODE>val stop : unit -&gt; 'a = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("13_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Write a function <TT><A id="a164__14_APPEND/PGcor.ml.tex" href="javascript: void showMessage('14_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 14,APPEND/PGcor.ml.tex,PGmouse -->mouse</SPAN></A></TT> of type 
<I>bitmap_state -&gt; int -&gt; int -&gt; unit</I> which modifies the pixel
state corresponding to the mouse click and displays the change.
<!-- POPUP DEFINITION -->
<layer id="l__14_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","14_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>mouse<CODE> </CODE>b<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>i<CODE>,</CODE>j<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>x<CODE> </CODE><CODE>/</CODE><CODE> </CODE>b<CODE>.</CODE>s<TT>)</TT><CODE>,</CODE><TT>(</TT>y<CODE>/</CODE>b<CODE>.</CODE>s<TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><TT>(</TT><CODE> </CODE>i<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>b<CODE>.</CODE>w<CODE> </CODE><TT>)</TT><CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE><TT>(</TT><CODE> </CODE>j<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>b<CODE>.</CODE>h<TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>begin</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>b<CODE>.</CODE>pix<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>not<CODE> </CODE>b<CODE>.</CODE>pix<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>draw_pix<CODE> </CODE>i<CODE> </CODE>j<CODE> </CODE>b<CODE>.</CODE>s<CODE> </CODE><TT>(</TT><B>if</B><CODE> </CODE>b<CODE>.</CODE>pix<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE>b<CODE>.</CODE>fg<CODE> </CODE><B>else</B><CODE> </CODE>b<CODE>.</CODE>bg<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>val mouse : bitmap_state -&gt; int -&gt; int -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("14_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Write a function <TT><A id="a165__15_APPEND/PGcor.ml.tex" href="javascript: void showMessage('15_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 15,APPEND/PGcor.ml.tex,PGkey -->key</SPAN></A></TT> of type <I>string 
-&gt; bitmap_state -&gt; char -&gt; unit</I> which takes as arguments the name
of a file, a bitmap and the char of the pressed key and executes the
associated actions: saving to a file for the key 'S' and raising of the
exception <TT>End</TT> for the key 'Q'.
<!-- POPUP DEFINITION -->
<layer id="l__15_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","15_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>key<CODE> </CODE>filename<CODE> </CODE>b<CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>c<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>'q'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'Q'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>End<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'s'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'S'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>write_bitmap<CODE> </CODE>filename<CODE> </CODE>b<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val key : string -&gt; bitmap_state -&gt; char -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("15_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></UL><BR>

<LI> Write a function <TT><A id="a166__16_APPEND/PGcor.ml.tex" href="javascript: void showMessage('16_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 16,APPEND/PGcor.ml.tex,PGgo -->go</SPAN></A></TT> which takes the name 
of a file as parameter, loads the bitmap, displays it and starts the
interactive loop.
<!-- POPUP DEFINITION -->
<layer id="l__16_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","16_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>go<CODE> </CODE>name<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>read_bitmap<CODE> </CODE>name<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>create_bitmap<CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE> </CODE>Graphics.black<CODE> </CODE>Graphics.white<CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>skel<CODE> </CODE><TT>(</TT>start<CODE> </CODE>b<TT>)</TT><CODE> </CODE>stop<CODE> </CODE><TT>(</TT>key<CODE> </CODE>name<CODE> </CODE>b<TT>)</TT><CODE> </CODE><TT>(</TT>mouse<CODE> </CODE>b<TT>)</TT><CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>e<CODE> </CODE>-&gt;<CODE> </CODE>()<TT>)</TT><CODE> </CODE>;;<BR><CODE>val go : string -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("16_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><A NAME="toc71"></A>
<H3> Earth worm</H3>
The earth worm is a small, longish organism of a certain size which grows
over time while eating objects in a world. The earth worm moves constantly
in one direction. The only actions allowing a player to control it are
changes in direction. The earth worm vanishes if it touches a border
of the world or if it passes over a part of its body. It is most often
represented by a vector of coordinates with two principal indices:
its head and its tail. A move will therefore be computed from the new
coordinates of its head, will display it and erase the tail. A growth
step only modifies its head without affecting the tail of the earth worm.
<OL type=1>
<LI>
 Write the Objective CAML type or <A id="a167__17_APPEND/PGcor.ml.tex" href="javascript: void showMessage('17_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 17,APPEND/PGcor.ml.tex,PGworm-type -->types</SPAN></A> for 
representing an earth worm and the world where it evolves. One can
represent an earth worm by a queue of its coordinates.
<!-- POPUP DEFINITION -->
<layer id="l__17_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","17_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>type</B><CODE> </CODE>cell<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Empty<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Full<CODE> </CODE>;;<BR><CODE>type cell = | Empty | Full</CODE><BR><BR># <B>type</B><CODE> </CODE>world<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<CODE> </CODE>sx<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE>sy<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE>cells<CODE> </CODE><CODE>:</CODE><CODE> </CODE>cell<CODE> </CODE>array<CODE> </CODE>array<CODE> </CODE>}<CODE> </CODE>;;<BR><CODE>type world = { sx: int; sy: int; cells: cell array array }</CODE><BR><BR># <B>type</B><CODE> </CODE>worm<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<CODE> </CODE><B>mutable</B><CODE> </CODE>head<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><B>mutable</B><CODE> </CODE>queue<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><B>mutable</B><CODE> </CODE>size<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>mutable</B><CODE> </CODE>vx<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><B>mutable</B><CODE> </CODE>vy<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>pos<CODE> </CODE><CODE>:</CODE><CODE> </CODE><TT>(</TT>int<CODE> </CODE><CODE>*</CODE><CODE> </CODE>int<TT>)</TT><CODE> </CODE>array<CODE> </CODE>}<CODE> </CODE>;;<BR><CODE>type worm =</CODE><BR><CODE>  { mutable head: int;</CODE><BR><CODE>    mutable queue: int;</CODE><BR><CODE>    mutable size: int;</CODE><BR><CODE>    mutable vx: int;</CODE><BR><CODE>    mutable vy: int;</CODE><BR><CODE>    pos: (int * int) array }</CODE><BR><BR># <B>type</B><CODE> </CODE>game<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<CODE> </CODE>w<CODE> </CODE><CODE>:</CODE><CODE> </CODE>world;<CODE> </CODE>wo<CODE> </CODE><CODE>:</CODE><CODE> </CODE>worm;<CODE> </CODE>s_cell<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>fg<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Graphics.color;<CODE> </CODE>bg<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Graphics.color<CODE> </CODE>}<CODE> </CODE>;;<BR><CODE>type game =</CODE><BR><CODE>  { w: world;</CODE><BR><CODE>    wo: worm;</CODE><BR><CODE>    s_cell: int;</CODE><BR><CODE>    fg: Graphics.color;</CODE><BR><CODE>    bg: Graphics.color }</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("17_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function for <A id="a168__18_APPEND/PGcor.ml.tex" href="javascript: void showMessage('18_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 18,APPEND/PGcor.ml.tex,PGworm-init -->initialization</SPAN></A>  
and <A id="a169__19_APPEND/PGcor.ml.tex" href="javascript: void showMessage('19_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 19,APPEND/PGcor.ml.tex,PGworm-display -->displaying</SPAN></A> an earth worm in a world. 
<!-- POPUP DEFINITION -->
<layer id="l__18_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","18_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>init_world<CODE> </CODE>sx<CODE> </CODE>sy<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>{<CODE> </CODE>sx<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sx;<CODE> </CODE>sy<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sy;<CODE> </CODE>cells<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.create_matrix<CODE> </CODE>sx<CODE> </CODE>sy<CODE> </CODE>Empty<CODE> </CODE>}<CODE> </CODE>;;<BR><CODE>val init_world : int -&gt; int -&gt; world = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>init_worm<CODE> </CODE>s<CODE> </CODE>s_max<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE> </CODE><CODE>&gt;</CODE><CODE> </CODE>x<CODE> </CODE><B>then</B><CODE> </CODE>failwith<CODE> </CODE><CODE>"init_worm"</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>begin</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>wo<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<CODE> </CODE>head<CODE> </CODE><CODE>=</CODE><CODE> </CODE>s<CODE>-</CODE><CODE>1</CODE>;<CODE> </CODE>queue<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE>;<CODE> </CODE>size<CODE> </CODE><CODE>=</CODE><CODE> </CODE>s;<CODE> </CODE><CODE> </CODE>vx<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE>;<CODE> </CODE>vy<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>pos<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.create<CODE> </CODE>s_max<CODE> </CODE><TT>(</TT><CODE>0</CODE><CODE>,</CODE><CODE>0</CODE><TT>)</TT><CODE> </CODE>}<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>y<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE>x<CODE> </CODE><CODE>/</CODE><CODE> </CODE><CODE>2</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>rx<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><TT>(</TT>x<CODE>/</CODE><CODE>2</CODE><CODE> </CODE><CODE>-</CODE><CODE> </CODE>s<CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>s<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE>wo<CODE>.</CODE>pos<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><TT>(</TT><CODE>!</CODE>rx<CODE>,</CODE>y<TT>)</TT><CODE> </CODE>;<CODE> </CODE>incr<CODE> </CODE>rx<CODE> </CODE><B>done</B><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>wo<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>val init_worm : int -&gt; int -&gt; int -&gt; worm = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>init_game<CODE> </CODE>s<CODE> </CODE>s_max<CODE> </CODE>sx<CODE> </CODE>sy<CODE> </CODE>sc<CODE> </CODE>c1<CODE> </CODE>c2<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>j<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<CODE> </CODE>w<CODE> </CODE><CODE>=</CODE><CODE> </CODE>init_world<CODE> </CODE>sx<CODE> </CODE>sy;<CODE> </CODE>wo<CODE> </CODE><CODE>=</CODE><CODE> </CODE>init_worm<CODE> </CODE>s<CODE> </CODE>s_max<CODE> </CODE>sx;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s_cell<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sc;<CODE> </CODE><CODE> </CODE>fg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>c1;<CODE> </CODE><CODE> </CODE><CODE> </CODE>bg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>c2<CODE> </CODE>}<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE>j<CODE>.</CODE>wo<CODE>.</CODE>head<CODE> </CODE><B>to</B><CODE> </CODE>j<CODE>.</CODE>wo<CODE>.</CODE>queue<CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><TT>(</TT>x<CODE>,</CODE>y<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE> </CODE>j<CODE>.</CODE>wo<CODE>.</CODE>pos<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>j<CODE>.</CODE>w<CODE>.</CODE>cells<CODE>.</CODE><TT>(</TT>x<TT>)</TT><CODE>.</CODE><TT>(</TT>y<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>Full<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>j<CODE> </CODE>;;<BR><CODE>val init_game :</CODE><BR><CODE>  int -&gt; int -&gt; int -&gt; int -&gt; int -&gt; Graphics.color -&gt; Graphics.color -&gt; game =</CODE><BR><CODE>  &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("18_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__19_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","19_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>display_cell<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE>s<CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.set_color<CODE> </CODE>c;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.fill_rect<CODE> </CODE><TT>(</TT>x<CODE>*</CODE>s<TT>)</TT><CODE> </CODE><TT>(</TT>y<CODE>*</CODE>s<TT>)</TT><CODE> </CODE>s<CODE> </CODE>s<CODE> </CODE>;;<BR><CODE>val display_cell : int -&gt; int -&gt; int -&gt; Graphics.color -&gt; unit = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>display_world<CODE> </CODE>game<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>w<CODE> </CODE><CODE>=</CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>w<CODE>.</CODE>sx<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>j<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>w<CODE>.</CODE>sy<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>col<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE>w<CODE>.</CODE>cells<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>Full<CODE> </CODE><B>then</B><CODE> </CODE>game<CODE>.</CODE>fg<CODE> </CODE><B>else</B><CODE> </CODE>game<CODE>.</CODE>bg<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>display_cell<CODE> </CODE>i<CODE> </CODE>j<CODE> </CODE>game<CODE>.</CODE>s_cell<CODE> </CODE>col<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val display_world : game -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("19_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Modify the function <TT><A id="a170__20_APPEND/PGcor.ml.tex" href="javascript: void showMessage('20_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 20,APPEND/PGcor.ml.tex,PGworm-skel -->skel</SPAN></A></TT> of the 
skeleton of the program which causes an action at each execution of the
interactive loop, parameterized by a function. The treatment of keyboard
events must not block.
<!-- POPUP DEFINITION -->
<layer id="l__20_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","20_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR><CODE>(**************  interaction **********)</CODE><CODE> </CODE><BR><BR># <B>let</B><CODE> </CODE>tempo<CODE> </CODE>ti<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>ti<CODE> </CODE><B>do</B><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>i<CODE> </CODE><CODE>*</CODE><CODE> </CODE>ti<CODE> </CODE><CODE>*</CODE><CODE> </CODE>ti<CODE> </CODE><TT>)</TT><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val tempo : int -&gt; unit = &lt;fun&gt;</CODE><BR><BR># <B>exception</B><CODE> </CODE>End;;<BR><CODE>exception End</CODE><BR># <B>let</B><CODE> </CODE>skel<CODE> </CODE>f_init<CODE> </CODE>f_end<CODE> </CODE>f_key<CODE> </CODE>f_mouse<CODE> </CODE>f_except<CODE> </CODE>f_run<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>f_init<CODE> </CODE>();<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>tempo<CODE> </CODE><CODE>2</CODE><CODE>0</CODE><CODE>0</CODE><CODE>0</CODE><CODE>0</CODE><CODE>0</CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>Graphics.key_pressed()<CODE> </CODE><B>then</B><CODE> </CODE>f_key<CODE> </CODE><TT>(</TT>Graphics.read_key()<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>f_run<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End<CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>End<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE>e<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>f_except<CODE> </CODE>e<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End<CODE> </CODE>-&gt;<CODE> </CODE>f_end<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val skel :</CODE><BR><CODE>  (unit -&gt; 'a) -&gt;</CODE><BR><CODE>  (unit -&gt; unit) -&gt;</CODE><BR><CODE>  (char -&gt; unit) -&gt; 'b -&gt; (exn -&gt; 'c) -&gt; (unit -&gt; 'c) -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("20_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function <TT><A id="a171__21_APPEND/PGcor.ml.tex" href="javascript: void showMessage('21_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 21,APPEND/PGcor.ml.tex,PGworm-run -->run</SPAN></A></TT> which 
advances the earth worm in the game. This function raises the exception
<TT>Victory</TT> (if the worm reaches a certain size) and <TT>Loss</TT>
if it hits a full slot or a border of the world.
<!-- POPUP DEFINITION -->
<layer id="l__21_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","21_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>exception</B><CODE> </CODE>Loss;;<BR><CODE>exception Loss</CODE><BR># <B>exception</B><CODE> </CODE>Victory;;<BR><CODE>exception Victory</CODE><BR><BR># <B>let</B><CODE> </CODE>run<CODE> </CODE>game<CODE> </CODE>temps<CODE> </CODE>itemps<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>incr<CODE> </CODE>temps;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>wo<CODE> </CODE><CODE>=</CODE><CODE> </CODE>game<CODE>.</CODE>wo<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.length<CODE> </CODE>wo<CODE>.</CODE>pos<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>sx<CODE>,</CODE>sy<CODE> </CODE><CODE>=</CODE><CODE> </CODE>wo<CODE>.</CODE>pos<CODE>.</CODE><TT>(</TT>wo<CODE>.</CODE>head<TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>nx<CODE>,</CODE>ny<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sx<CODE>+</CODE>wo<CODE>.</CODE>vx<CODE>,</CODE>sy<CODE>+</CODE>wo<CODE>.</CODE>vy<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><TT>(</TT>nx<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><TT>)</TT><CODE> </CODE><CODE>||</CODE><CODE> </CODE><TT>(</TT>nx<CODE> </CODE><CODE>&gt;=</CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>sx<TT>)</TT><CODE> </CODE><CODE>||</CODE><CODE> </CODE><TT>(</TT>ny<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE><CODE>0</CODE><TT>)</TT><CODE> </CODE><CODE>||</CODE><CODE> </CODE><TT>(</TT>ny<CODE> </CODE><CODE>&gt;=</CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>sy<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>Loss<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><B>if</B><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>cells<CODE>.</CODE><TT>(</TT>nx<TT>)</TT><CODE>.</CODE><TT>(</TT>ny<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>Full<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>Loss<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><B>if</B><CODE> </CODE>wo<CODE>.</CODE>head<CODE> </CODE><CODE>=</CODE><CODE> </CODE>wo<CODE>.</CODE>queue<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>Victory<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>begin</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>nhead<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>wo<CODE>.</CODE>head<CODE> </CODE><CODE>+</CODE><CODE> </CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><B>mod</B><CODE> </CODE>s<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>wo<CODE>.</CODE>head<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>nhead<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>wo<CODE>.</CODE>pos<CODE>.</CODE><TT>(</TT>wo<CODE>.</CODE>head<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><TT>(</TT>nx<CODE>,</CODE>ny<TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>cells<CODE>.</CODE><TT>(</TT>nx<TT>)</TT><CODE>.</CODE><TT>(</TT>ny<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>Full<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>display_cell<CODE> </CODE>nx<CODE> </CODE>ny<CODE> </CODE>game<CODE>.</CODE>s_cell<CODE> </CODE>game<CODE>.</CODE>fg<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><TT>(</TT><CODE>!</CODE>temps<CODE> </CODE><B>mod</B><CODE> </CODE><CODE>!</CODE>itemps<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE><TT>(</TT><CODE>!</CODE>itemps<CODE> </CODE><CODE>-</CODE><CODE> </CODE><CODE>2</CODE><TT>)</TT><TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>begin</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>qx<CODE>,</CODE>qy<CODE> </CODE><CODE>=</CODE><CODE> </CODE>wo<CODE>.</CODE>pos<CODE>.</CODE><TT>(</TT>wo<CODE>.</CODE>queue<TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>cells<CODE>.</CODE><TT>(</TT>qx<TT>)</TT><CODE>.</CODE><TT>(</TT>qy<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>Empty<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>display_cell<CODE> </CODE>qx<CODE> </CODE>qy<CODE> </CODE>game<CODE>.</CODE>s_cell<CODE> </CODE>game<CODE>.</CODE>bg<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>wo<CODE>.</CODE>queue<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>wo<CODE>.</CODE>queue<CODE> </CODE><CODE>+</CODE><CODE> </CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><B>mod</B><CODE> </CODE>s<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>val run : game -&gt; int ref -&gt; int ref -&gt; unit -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("21_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function for <A id="a172__22_APPEND/PGcor.ml.tex" href="javascript: void showMessage('22_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 22,APPEND/PGcor.ml.tex,PGworm-key -->keyboard interaction</SPAN></A>  
which modifies the direction of the earth worm.
<!-- POPUP DEFINITION -->
<layer id="l__22_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","22_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>key<CODE> </CODE>lact<CODE> </CODE>game<CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>c<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>'q'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'Q'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>End<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'p'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'P'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Graphics.read_key<CODE> </CODE>()<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'2'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'4'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'6'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'8'</CODE><CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>dx<CODE>,</CODE>dy<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.assoc<CODE> </CODE>c<CODE> </CODE>lact<CODE> </CODE><B>in</B><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>game<CODE>.</CODE>wo<CODE>.</CODE>vx<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>dx<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>game<CODE>.</CODE>wo<CODE>.</CODE>vy<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>dy<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val key : (char * (int * int)) list -&gt; game -&gt; char -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("22_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write the other <A id="a173__23_APPEND/PGcor.ml.tex" href="javascript: void showMessage('23_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 23,APPEND/PGcor.ml.tex,PGworm-util -->utility functions</SPAN></A> for handling 
interaction and pass them to the new skeleton of the program.
<!-- POPUP DEFINITION -->
<layer id="l__23_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","23_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>start<CODE> </CODE>game<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>sw<CODE> </CODE><CODE>=</CODE><CODE> </CODE>game<CODE>.</CODE>s_cell<CODE> </CODE><CODE>*</CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>sx<CODE> </CODE><B>and</B><CODE> </CODE>sh<CODE> </CODE><CODE>=</CODE><CODE> </CODE>game<CODE>.</CODE>s_cell<CODE> </CODE><CODE>*</CODE><CODE> </CODE>game<CODE>.</CODE>w<CODE>.</CODE>sy<CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>size<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>string_of_int<CODE> </CODE>sw<TT>)</TT><CODE> </CODE><CODE>^</CODE><CODE> </CODE><CODE>"x"</CODE><CODE> </CODE><CODE>^</CODE><CODE> </CODE><TT>(</TT>string_of_int<CODE> </CODE>sh<TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.open_graph<CODE> </CODE><TT>(</TT><CODE>" "</CODE><CODE> </CODE><CODE>^</CODE><CODE> </CODE>size<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.set_color<CODE> </CODE><CODE> </CODE><TT>(</TT>Graphics.rgb<CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.fill_rect<CODE> </CODE><CODE>0</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE>sw<CODE> </CODE>sh;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>display_world<CODE> </CODE>game;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Graphics.read_key()<TT>)</TT><CODE> </CODE>;;<BR><CODE>val start : game -&gt; unit -&gt; unit = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>stop<CODE> </CODE>game<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>ignore<CODE> </CODE><TT>(</TT>Graphics.read_key()<TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Graphics.close_graph()<CODE> </CODE>;;<BR><CODE>val stop : 'a -&gt; unit -&gt; unit = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>mouse<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE><CODE>=</CODE><CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val mouse : 'a -&gt; 'b -&gt; unit = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>except<CODE> </CODE>e<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>e<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Loss<CODE> </CODE>-&gt;<CODE> </CODE>print_endline<CODE> </CODE><CODE>"LOSS"</CODE>;<CODE> </CODE>raise<CODE> </CODE>End<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Victory<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>print_endline<CODE> </CODE><CODE>"VICTORY"</CODE>;<CODE> </CODE>raise<CODE> </CODE>End<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE>e<CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>e<CODE> </CODE>;;<BR><CODE>val except : exn -&gt; 'a = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("23_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write the <A id="a174__24_APPEND/PGcor.ml.tex" href="javascript: void showMessage('24_APPEND/PGcor.ml.tex')" class="mousable"><SPAN style=""><!-- 24,APPEND/PGcor.ml.tex,PGworm-go -->initiating function</SPAN></A> which starts 
the application.
<!-- POPUP DEFINITION -->
<layer id="l__24_APPEND/PGcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","24_APPEND/PGcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>la<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>[</CODE><CODE> </CODE><TT>(</TT><CODE>'2'</CODE><CODE>,</CODE><TT>(</TT><CODE>0</CODE><CODE>,-</CODE><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>;<CODE> </CODE><TT>(</TT><CODE>'4'</CODE><CODE>,</CODE><TT>(</TT><CODE>-</CODE><CODE>1</CODE><CODE>,</CODE><CODE>0</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>;<CODE> </CODE><TT>(</TT><CODE>'6'</CODE><CODE>,</CODE><TT>(</TT><CODE>1</CODE><CODE>,</CODE><CODE>0</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>;<CODE> </CODE><TT>(</TT><CODE>'8'</CODE><CODE>,</CODE><TT>(</TT><CODE>0</CODE><CODE>,</CODE><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE><CODE>]</CODE><CODE> </CODE>;;<BR><CODE>val la : (char * (int * int)) list =</CODE><BR><CODE>  ['2', (0, -1); '4', (-1, 0); '6', (1, 0); '8', (0, ...)]</CODE><BR><BR># <B>let</B><CODE> </CODE>go<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE>sc<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>col<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Graphics.rgb<CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><CODE>1</CODE><CODE>5</CODE><CODE>0</CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>game<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE> </CODE>init_game<CODE> </CODE><CODE>5</CODE><CODE> </CODE><TT>(</TT>x<CODE>*</CODE>y<CODE> </CODE><CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE>sc<CODE> </CODE>Graphics.black<CODE> </CODE>col<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>skel<CODE> </CODE><TT>(</TT>start<CODE> </CODE>game<TT>)</TT><CODE> </CODE><TT>(</TT>stop<CODE> </CODE>game<TT>)</TT><CODE> </CODE><TT>(</TT>key<CODE> </CODE>la<CODE> </CODE>game<TT>)</TT><CODE> </CODE>mouse<CODE> </CODE>except<CODE> </CODE><TT>(</TT>run<CODE> </CODE>game<CODE> </CODE><TT>(</TT>ref<CODE> </CODE><CODE>0</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>ref<CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE>0</CODE><TT>)</TT><TT>)</TT>;;<BR><CODE>val go : int -&gt; int -&gt; int -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("24_APPEND/PGcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><HR>
<A HREF="book-ora051.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora053.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
